home *** CD-ROM | disk | FTP | other *** search
- #
- # keiro11.pl : 幅優先探索
- #
- # H───I───J───K
- # │ │ /│
- # │ │ / │
- # │ │/ │
- # E───F───G
- # │ /│ │
- # │ / │ │
- # │/ │ │
- # A───B───C───D
- #
-
- # 隣接リスト
- %adjacent = (
- 'A' => ['B', 'E', 'F'],
- 'B' => ['A', 'C', 'F'],
- 'C' => ['B', 'D', 'G'],
- 'D' => ['C'],
- 'E' => ['A', 'F', 'H'],
- 'F' => ['A', 'B', 'E', 'G', 'I', 'J'],
- 'G' => ['C', 'F', 'J'],
- 'H' => ['E', 'I'],
- 'I' => ['F', 'H', 'J'],
- 'J' => ['G', 'I', 'K'],
- 'K' => ['J']
- );
-
- # 探索
- sub search {
- my ($start, $end) = @_;
- my @queue = (); # 経路を格納するキュー
- push( @queue, [$start] ); # スタート地点をセット
- while( @queue > 0 ){
- my $path = shift( @queue ); # 経路を取り出す
- my $postion = $path->[$#$path]; # 最後の頂点を取り出す
- foreach $next ( @{ $adjacent{$postion} } ){
- # $next が経路に含まれていないことを確認
- if( !grep( /$next/, @$path ) ){
- my $new_path = [ @$path ]; # 経路をコピー
- push( @$new_path, $next );
- if( $next eq $end ){
- print "@$new_path\n";
- } else {
- push( @queue, $new_path ); # キューに追加
- }
- }
- }
- }
- }
-
- # 実行
- &search( 'A', 'K' );
-
- # end of file
-
-